/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package occho.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import occho.model.Asignatura;
import occho.model.Pregunta;
import occho.model.PreguntaAlumno;
import occho.model.Respuesta;
import occho.model.Tema;
import occho.model.Usuario;

/**
 *
 * @author migue
 */
public class OraclePreguntaAlumnoDAO implements PreguntaAlumnoDAO {

    private Connection conn = null;

    /**
     * Constructor de la clase
     * @param conn
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public OraclePreguntaAlumnoDAO(Connection conn) throws ClassNotFoundException, SQLException {
        this.conn = conn;
    }
    
    @Override
    public boolean insertarPreguntaAlumno(PreguntaAlumno pa) throws SQLException {
        PreparedStatement stmt = conn.prepareStatement("insert into pregunta_alumno (idPregunta, idAlumno,acertada,idtest) values(?, ?, ?, ?)");
        stmt.clearParameters();
        stmt.setInt(1, pa.getIdPregunta());
        stmt.setInt(2, pa.getIdAlumno());
        stmt.setBoolean(3, pa.isAcertada());
        stmt.setInt(4, pa.getIdTest());

        if (stmt.executeUpdate() > 0) {
            stmt.close();
            return true;
        } else {
            stmt.close();
            return false;
        }
    }

    @Override
    public boolean actualizarPreguntaAlumno(PreguntaAlumno pa) throws SQLException {
        //</editor-fold>
        PreparedStatement stmt = conn.prepareStatement("update pregunta_alumno set acertada=? where idpregunta=? and idalumno=? and idtest=?");
        stmt.clearParameters();
        stmt.setBoolean(1, pa.isAcertada());
        stmt.setInt(2, pa.getIdPregunta());
        stmt.setInt(3, pa.getIdAlumno());
        stmt.setInt(4, pa.getIdTest());
        if (stmt.executeUpdate() > 0) {
            stmt.close();
            return true;
        } else {
            stmt.close();
            return false;
        }
    }

    @Override
    public boolean eliminarPreguntaAlumno(PreguntaAlumno pa) throws SQLException {
        PreparedStatement stmt = conn.prepareStatement("delete from pregunta_alumno where idPregunta = ? and idalumno= ? and idtest= ?");
        stmt.clearParameters();
        stmt.setInt(1, pa.getIdPregunta());
        stmt.setInt(2, pa.getIdAlumno());
        stmt.setInt(3, pa.getIdTest());
        if (stmt.executeUpdate() > 0) {
            stmt.close();
            return true;
        } else {
            stmt.close();
            return false;
        }
    }

    @Override
    public PreguntaAlumno seleccionarPreguntaAlumno(int idAlumno, int idPregunta, int idTest) throws SQLException {
        PreparedStatement stmt = conn.prepareStatement("select * from pregunta_alumno where idPregunta = ? and idalumno= ? and idtest= ?");
        stmt.clearParameters();
        stmt.setInt(1, idAlumno);
        stmt.setInt(2, idPregunta);
        stmt.setInt(3, idTest);
        ResultSet rs = stmt.executeQuery();
        if (rs.next()) {
            PreguntaAlumno pa = new PreguntaAlumno(rs.getInt("idpregunta"), rs.getInt("idalumno"), 
                    rs.getBoolean("acertada"), rs.getInt("idtest"));
            rs.close();
            stmt.close();
            return pa;
        } else {
            rs.close();
            stmt.close();
            return null;
        }
    }

    @Override
    public List<PreguntaAlumno> seleccionarPreguntaAlumno(int idAlumno) throws SQLException {
        ArrayList<PreguntaAlumno> lista = new ArrayList<PreguntaAlumno>();
        PreparedStatement stmt = conn.prepareStatement("select * from pregunta_alumno where idalumno= ?");
        stmt.clearParameters();
        stmt.setInt(1, idAlumno);
        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {

            lista.add(new PreguntaAlumno(rs.getInt("idpregunta"), rs.getInt("idalumno"), rs.getBoolean("acertada"), rs.getInt("idtest")));
        }
        rs.close();
        stmt.close();

        return lista;
    }

    @Override
    public List<Asignatura> seleccionarAsignaturasAlumno(Usuario usuario) throws SQLException, ClassNotFoundException {
        OracleDAOFactory daoFactory = OracleDAOFactory.getInstancia();
        AsignaturaDAO asignaturaDAO = daoFactory.getAsignaturaDAO();
        TestDAO testDAO = daoFactory.getTestDAO();
        List<Asignatura> asignaturas = new ArrayList<Asignatura>();
        String sql = "select distinct t.idasignatura "
                + "from test t, pregunta_alumno pa "
                + "where pa.idtest = t.idtest "
                + "and pa.idalumno = ?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.clearParameters();
        stmt.setInt(1, usuario.getIdUsuario());
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            Asignatura asignatura = new Asignatura();
            asignatura.setIdAsignatura(rs.getInt("idasignatura"));
            asignatura = asignaturaDAO.seleccionarAsignatura(asignatura);
            asignatura.setTests(testDAO.seleccionarTests(usuario, asignatura));
            asignaturas.add(asignatura);
        }
        rs.close();
        stmt.close();

        return asignaturas;
    }

    @Override
    public List<Tema> seleccionarTemasAlumno(int idAlumno) throws SQLException, ClassNotFoundException {
        Pregunta p = new Pregunta();
        ArrayList<Tema> lista = new ArrayList<Tema>();
        OracleDAOFactory daoFactory = OracleDAOFactory.getInstancia();
        PreguntaDAO pDAO = daoFactory.getPreguntaDAO();
        PreparedStatement stmt = conn.prepareStatement("select idpregunta from pregunta_alumno where idalumno= ?");
        stmt.clearParameters();
        stmt.setInt(1, idAlumno);
        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            p.setIdPregunta(rs.getInt("idpregunta"));
            lista.add(pDAO.seleccionarTema(p));
        }
        rs.close();
        stmt.close();
        return lista;
    }

    @Override
    public float getMediaTestAlumno(int idAlumno, int idTest) throws SQLException {
        float suma = 0;
        int rowcount = 0;
        PreparedStatement stmt = conn.prepareStatement("select * from pregunta_alumno where idalumno= ? and idtest= ?");
        stmt.clearParameters();
        stmt.setInt(1, idAlumno);
        stmt.setInt(2, idTest);
        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            if (rs.getBoolean("acertada")) {
                suma++;
            }
            rowcount++;
        }
        rs.close();
        stmt.close();

        return suma / rowcount;
    }

    @Override
    public HashMap<Tema, Float> getMediaTemasAlumno(int idAlumno) throws SQLException, ClassNotFoundException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public HashMap<Asignatura, Float> getMediaAsignaturasAlumno(int idAlumno) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * Cierra la conexion a la base de datos
     * @throws SQLException
     */
    public void closeConnection() throws SQLException {
        this.conn.close();
    }

    /**
     * Se modifica el SetAutoCommit de la conexion
     * @param b
     * @throws SQLException
     */
    public void setAutoCommit(boolean b) throws SQLException {
        this.conn.setAutoCommit(b);
    }
    
    /**
     * Se realiza commit en la base de datos
     * @throws SQLException
     */
    public void commit() throws SQLException {
        this.conn.commit();
    }

    /**
     * Se realiza rollback en la base de datos
     * @throws SQLException
     */
    public void rollback() throws SQLException {
        this.conn.rollback();
    }
    
    /**
     * Devuelver una lista con los ids de los alumnos que han realizado un test.
     * @param idtest
     * @return List<Integer>
     * @throws SQLException
     */
    @Override
    public List<Integer> seleccionarAlumnosTest(int idtest) throws SQLException{
        ArrayList<Integer> lIdAlumno = new ArrayList<Integer>();
        PreparedStatement stmt = conn.prepareStatement("select distinct idalumno from pregunta_alumno where idtest=?");
        stmt.clearParameters();
        stmt.setInt(1, idtest);
        ResultSet rs = stmt.executeQuery();
        while(rs.next()){
            lIdAlumno.add(rs.getInt("idalumno"));
        }
        rs.close();
        stmt.close();
        return lIdAlumno;
    }
    
    /**
     * Devuelve una lista con los resultados de las preguntas de un alumno en un text.
     * @param idTest
     * @return List<PreguntaAlumno>
     * @throws SQLException
     */
    public List<PreguntaAlumno> seleccionarPreguntaAlumnoTest(int idTest) throws SQLException {
        ArrayList<PreguntaAlumno> lista = new ArrayList<PreguntaAlumno>();
        PreparedStatement stmt = conn.prepareStatement("select * from pregunta_alumno where idtest= ?");
        stmt.clearParameters();
        stmt.setInt(1, idTest);
        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {

            lista.add(new PreguntaAlumno(rs.getInt("idpregunta"), rs.getInt("idalumno"), rs.getBoolean("acertada"), rs.getInt("idtest")));
        }
        rs.close();
        stmt.close();

        return lista;
    }
}
